Оператор [subscribe]
Назначение
Оператор [subscribe] позволяет подписать логический узел правила на системное событие. Это даёт возможность реагировать на асинхронные события, возникающие в работе устройства (например, поднятие сетевого интерфейса, изменение конфигурации и т.п.).
Принцип работы
Когда происходит событие (например, интерфейс инициирует на системной шине событие IFUP), узел с оператором [subscribe] получает данные этого события.
Важная особенность: Данные, полученные по подписке, хранятся в течение двух итераций обработки правила. Это необходимо для того, чтобы все узлы правила (включая те, что расположены до узла-подписчика) успели обработать поступившую информацию.
Структура оператора
Оператор [subscribe] принимает таблицу с параметрами:
| Параметр | Описание |
|---|---|
ubus |
Название объекта, от которого ожидается событие |
evname |
Имя события, на которое осуществляется подписка |
match |
Фильтр по атрибутам события (опционально) |
Пример правила с подпиской
В данном примере 3 узла:
- N1_before — отправляет данные в веб-интерфейс (оператор
ui-update) - N2_gsm_up — ожидает данные по подписке (оператор
subscribe) - N3_after — журналирует событие (оператор
journal)
1-й и 3-й узлы используют данные 2-го узла, поступившие в него по подписке.
Код правила
--[[ Узел "N1_before" ]]
------------------------
N1_before = {
{
["ui-update"] = function(nodes)
return {
event_name = "Состояние сетевого интерфейса `modem` - UP",
event_data = nodes.N2_gsm_up
}
end
}
}
--[[ Узел "N2_gsm_up" ]]
------------------------
N2_gsm_up = {
["subscribe"] = function(nodes) -- Оператор ["subscribe"] принимает в качестве настроек следующие параметры:
return {
ubus = "network.interface", -- - название объекта, от которого ожидать событие;
evname = "interface.update", -- - имя события, на которое подписаться;
match = { interface = "modem"} -- - означает фильтровать поступающие события по атрибуту "interface=modem";
}
end
}
--[[ Узел "N3_after" ]]
-----------------------
N3_after = {
{
["ui-update"] = function(nodes)
return {
event = "Изменилось состояние сетевого интерфейса `modem`",
event_data = nodes.N2_gsm_up
}
end
}
}